package com.example.rabc;

import com.example.rabc.dao.UserDao;
import com.example.rabc.dao.RoleDao;
import com.example.rabc.dao.PermissionDao;
import com.example.rabc.factory.DaoFactory;
import com.example.rabc.factory.DaoFactoryManager;
import com.example.rabc.entity.User;
import com.example.rabc.entity.Role;
import com.example.rabc.entity.Permission;

import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Optional;

/**
 * DAO层测试类
 * 演示如何使用抽象工厂模式创建DAO实例并进行操作
 */
public class DaoTest {
    
    public static void main(String[] args) {
        // 获取DAO工厂实例
        DaoFactory factory = DaoFactoryManager.getDaoFactory();
        
        // 创建用户DAO实例
        UserDao userDao = factory.createUserDao();
        
        // 创建角色DAO实例
        RoleDao roleDao = factory.createRoleDao();
        
        // 创建权限DAO实例
        PermissionDao permissionDao = factory.createPermissionDao();
        
        // 测试用户DAO操作
        testUserDao(userDao);
        
        // 测试角色DAO操作
        testRoleDao(roleDao);
        
        // 测试权限DAO操作
        testPermissionDao(permissionDao);
    }
    
    private static void testUserDao(UserDao userDao) {
        System.out.println("=== 测试用户DAO ===");
        
        // 创建用户实体
        User user = new User();
        user.setUsername("testuser");
        user.setPassword("password123");
        user.setEmail("test@example.com");
        user.setRealName("测试用户");
        user.setStatus(1);
        user.setCreatedTime(LocalDateTime.now());
        user.setUpdatedTime(LocalDateTime.now());
        
        // 保存用户
        User savedUser = userDao.save(user);
        System.out.println("保存用户成功，ID: " + savedUser.getId());
        
        // 根据ID查找用户
        Optional<User> foundUser = userDao.findById(savedUser.getId());
        if (foundUser.isPresent()) {
            System.out.println("找到用户: " + foundUser.get().getUsername());
        }
        
        // 根据用户名查找用户
        Optional<User> userByName = userDao.findByUsername("testuser");
        if (userByName.isPresent()) {
            System.out.println("根据用户名找到用户: " + userByName.get().getEmail());
        }
        
        // 查找所有用户
        List<User> allUsers = userDao.findAll();
        System.out.println("用户总数: " + allUsers.size());
        
        // 更新用户
        if (foundUser.isPresent()) {
            User updateUser = foundUser.get();
            updateUser.setRealName("更新后的测试用户");
            updateUser.setUpdatedTime(LocalDateTime.now());
            userDao.update(updateUser.getId(), updateUser);
            System.out.println("用户更新成功");
        }
        
        // 删除用户
        // userDao.deleteById(savedUser.getId());
        // System.out.println("用户删除成功");
    }
    
    private static void testRoleDao(RoleDao roleDao) {
        System.out.println("=== 测试角色DAO ===");
        
        // 创建角色实体
        Role role = new Role();
        role.setRoleName("测试角色");
        role.setRoleCode("TEST_ROLE");
        role.setDescription("这是一个测试角色");
        role.setStatus(1);
        role.setCreatedTime(LocalDateTime.now());
        role.setUpdatedTime(LocalDateTime.now());
        
        // 保存角色
        Role savedRole = roleDao.save(role);
        System.out.println("保存角色成功，ID: " + savedRole.getId());
        
        // 根据ID查找角色
        Optional<Role> foundRole = roleDao.findById(savedRole.getId());
        if (foundRole.isPresent()) {
            System.out.println("找到角色: " + foundRole.get().getRoleName());
        }
        
        // 根据角色代码查找角色
        Optional<Role> roleByCode = roleDao.findByRoleCode("TEST_ROLE");
        if (roleByCode.isPresent()) {
            System.out.println("根据角色代码找到角色: " + roleByCode.get().getDescription());
        }
        
        // 查找所有角色
        List<Role> allRoles = roleDao.findAll();
        System.out.println("角色总数: " + allRoles.size());
    }
    
    private static void testPermissionDao(PermissionDao permissionDao) {
        System.out.println("=== 测试权限DAO ===");
        
        // 创建权限实体
        Permission permission = new Permission();
        permission.setPermissionName("测试权限");
        permission.setPermissionCode("TEST_PERMISSION");
        permission.setResourceType("MENU");
        permission.setResourcePath("/test");
        permission.setParentId(0L);
        permission.setDescription("这是一个测试权限");
        permission.setStatus(1);
        permission.setCreatedTime(LocalDateTime.now());
        permission.setUpdatedTime(LocalDateTime.now());
        
        // 保存权限
        Permission savedPermission = permissionDao.save(permission);
        System.out.println("保存权限成功，ID: " + savedPermission.getId());
        
        // 根据ID查找权限
        Optional<Permission> foundPermission = permissionDao.findById(savedPermission.getId());
        if (foundPermission.isPresent()) {
            System.out.println("找到权限: " + foundPermission.get().getPermissionName());
        }
        
        // 根据权限代码查找权限
        Optional<Permission> permissionByCode = permissionDao.findByPermissionCode("TEST_PERMISSION");
        if (permissionByCode.isPresent()) {
            System.out.println("根据权限代码找到权限: " + permissionByCode.get().getResourceType());
        }
        
        // 查找所有权限
        List<Permission> allPermissions = permissionDao.findAll();
        System.out.println("权限总数: " + allPermissions.size());
    }
}